package br.com.locasis.entity;

// Generated 24/05/2012 20:14:44 by Hibernate Tools 3.4.0.CR1

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

import br.com.locasis.utilitarios.UtilString;

/**
 * Aluguel generated by hbm2java
 */
@Entity
@Table(name = "aluguel")
public class Aluguel implements java.io.Serializable {

	private Integer idAluguel;
	private Usuario usuarioRecebimento;
	private FormaPagamento formaPagamento;
	private Usuario usuarioEntrega;
	private Pais pais;
	private Automovel automovel;
	private Cliente cliente;
	private Date dataSaida;
	private Date dataRetorno;
	private Integer kmSaida;
	private Integer kmRetorno;
	private Date dataPrevistaEntrega;
	private Integer totalDiarias;
	private Integer totalKms;
	private Integer horasAdicionais;
	private String numeroCartao;
	private String validadeCartao;
	private String banco;
	private String agencia;
	private String contaCorrente;
	private String titularCartao;
	private boolean flgProprioCondutor;
	private String nomeCondutor;
	private String habilitacaoCondutor;
	private String regiao;
	private Date habilitacaoValidade;
	private String cpfCondutor;
	private String enderecoCondutor;
	private String municipioCondutor;
	private String bairroCondutor;
	private String telefoneCondutor;
	private String celularCondutor;
	private Float totalAluguel;
	private byte[] laudoVistoria;
	private String siglaUfCondutor;
	private boolean flgAtivo;
	private TabelaValorAutomovel tabelaValorAutomovel;
	private Float vlrCaucao;
	private String codAutorizacao;
	private String origemCidadePermitida;
	private String origemUfPermitida;
	private String destinoCidadePermitida;
	private String destinoUfPermitida;
	private Set<AluguelProduto> aluguelProdutos = new HashSet<AluguelProduto>(0);
	private Set<PagamentoAluguel> pagamentoAluguels = new HashSet<PagamentoAluguel>(
			0);
	
	private boolean selecionado;
	
	private Integer horaSaida;
	private Integer minutoSaida;
	
	private Integer horaRetorno;
	private Integer minutoRetorno;
	
	private Integer horaPrevRetorno;
	private Integer minutoPrevRetorno;
	
	private ValorPagamento pagamentoDiarias;
	
	private List<AluguelProduto> produtosAlugados;
	
	private boolean showIconeAlerta;

	private Cobertura cobertura;
	
	private Float totalDescontos;
	
	public Aluguel() {
	}

	public Aluguel(Integer idAluguel, FormaPagamento formaPagamento,
			Usuario usuarioByIdUsuarioEntrega, Automovel automovel,
			Cliente cliente, Date dataSaida, Integer kmSaida, Integer totalDiarias,
			boolean flgProprioCondutor, Float totalAluguel, byte[] laudoVistoria) {
		this.idAluguel = idAluguel;
		this.formaPagamento = formaPagamento;
		this.automovel = automovel;
		this.cliente = cliente;
		this.dataSaida = dataSaida;
		this.kmSaida = kmSaida;
		this.totalDiarias = totalDiarias;
		this.flgProprioCondutor = flgProprioCondutor;
		this.totalAluguel = totalAluguel;
		this.laudoVistoria = laudoVistoria;
	}

	public Aluguel(Integer idAluguel, Usuario usuarioByIdUsuarioRecebimento,
			FormaPagamento formaPagamento, Usuario usuarioByIdUsuarioEntrega,
			Pais pais, Automovel automovel, Cliente cliente, Date dataSaida,
			Date dataRetorno, Integer kmSaida, Integer kmRetorno,
			Date dataPrevistaEntrega, Integer totalDiarias, Integer totalKms,
			Integer horasAdicionais, String numeroCartao, Date validadeCartao,
			String banco, String agencia, String contaCorrente,
			String titularCartao, boolean flgProprioCondutor,
			String nomeCondutor, String habilitacaoCondutor, String regiao,
			Date habilitacaoValidade, String cpfCondutor,
			String enderecoCondutor, String municipioCondutor,
			String bairroCondutor, String telefoneCondutor,
			String celularCondutor, Float totalAluguel, byte[] laudoVistoria,
			String siglaUfCondutor, Set<AluguelProduto> aluguelProdutos,
			Set<PagamentoAluguel> pagamentoAluguels) {
		this.idAluguel = idAluguel;
		this.formaPagamento = formaPagamento;
		this.pais = pais;
		this.automovel = automovel;
		this.cliente = cliente;
		this.dataSaida = dataSaida;
		this.dataRetorno = dataRetorno;
		this.kmSaida = kmSaida;
		this.kmRetorno = kmRetorno;
		this.dataPrevistaEntrega = dataPrevistaEntrega;
		this.totalDiarias = totalDiarias;
		this.totalKms = totalKms;
		this.horasAdicionais = horasAdicionais;
		this.numeroCartao = numeroCartao;
		this.banco = banco;
		this.agencia = agencia;
		this.contaCorrente = contaCorrente;
		this.titularCartao = titularCartao;
		this.flgProprioCondutor = flgProprioCondutor;
		this.nomeCondutor = nomeCondutor;
		this.habilitacaoCondutor = habilitacaoCondutor;
		this.regiao = regiao;
		this.habilitacaoValidade = habilitacaoValidade;
		this.cpfCondutor = cpfCondutor;
		this.enderecoCondutor = enderecoCondutor;
		this.municipioCondutor = municipioCondutor;
		this.bairroCondutor = bairroCondutor;
		this.telefoneCondutor = telefoneCondutor;
		this.celularCondutor = celularCondutor;
		this.totalAluguel = totalAluguel;
		this.laudoVistoria = laudoVistoria;
		this.siglaUfCondutor = siglaUfCondutor;
		this.aluguelProdutos = aluguelProdutos;
		this.pagamentoAluguels = pagamentoAluguels;
	}

	@Id
	@Column(name = "id_aluguel", unique = true, nullable = false)
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public Integer getIdAluguel() {
		return this.idAluguel;
	}

	public void setIdAluguel(Integer idAluguel) {
		this.idAluguel = idAluguel;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_usuario_recebimento")
	public Usuario getUsuarioRecebimento() {
		return usuarioRecebimento;
	}

	public void setUsuarioRecebimento(Usuario usuarioRecebimento) {
		this.usuarioRecebimento = usuarioRecebimento;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_usuario_entrega", nullable = false)
	@NotNull
	public Usuario getUsuarioEntrega() {
		return usuarioEntrega;
	}

	public void setUsuarioEntrega(Usuario usuarioEntrega) {
		this.usuarioEntrega = usuarioEntrega;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_forma_pagamento", nullable = false)
	@NotNull
	public FormaPagamento getFormaPagamento() {
		return this.formaPagamento;
	}

	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_pais_condutor")
	public Pais getPais() {
		return this.pais;
	}

	public void setPais(Pais pais) {
		this.pais = pais;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_automovel", nullable = false)
	@NotNull
	public Automovel getAutomovel() {
		return this.automovel;
	}

	public void setAutomovel(Automovel automovel) {
		this.automovel = automovel;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_cliente", nullable = false)
	@NotNull
	public Cliente getCliente() {
		return this.cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_saida", nullable = false, length = 29)
	@NotNull
	public Date getDataSaida() {
		return this.dataSaida;
	}

	public void setDataSaida(Date dataSaida) {
		this.dataSaida = dataSaida;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_retorno", length = 29)
	public Date getDataRetorno() {
		return this.dataRetorno;
	}

	public void setDataRetorno(Date dataRetorno) {
		this.dataRetorno = dataRetorno;
	}

	@Column(name = "km_saida", nullable = false)
	public Integer getKmSaida() {
		return this.kmSaida;
	}

	public void setKmSaida(Integer kmSaida) {
		this.kmSaida = kmSaida;
	}

	@Column(name = "km_retorno")
	public Integer getKmRetorno() {
		return this.kmRetorno;
	}

	public void setKmRetorno(Integer kmRetorno) {
		this.kmRetorno = kmRetorno;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_prevista_entrega", length = 29)
	public Date getDataPrevistaEntrega() {
		return this.dataPrevistaEntrega;
	}

	public void setDataPrevistaEntrega(Date dataPrevistaEntrega) {
		this.dataPrevistaEntrega = dataPrevistaEntrega;
	}

	@Column(name = "total_diarias", nullable = false)
	public Integer getTotalDiarias() {
		return this.totalDiarias;
	}

	public void setTotalDiarias(Integer totalDiarias) {
		this.totalDiarias = totalDiarias;
	}

	@Column(name = "total_kms")
	public Integer getTotalKms() {
		return this.totalKms;
	}

	public void setTotalKms(Integer totalKms) {
		this.totalKms = totalKms;
	}

	@Column(name = "horas_adicionais")
	public Integer getHorasAdicionais() {
		return this.horasAdicionais;
	}

	public void setHorasAdicionais(Integer horasAdicionais) {
		this.horasAdicionais = horasAdicionais;
	}

	@Column(name = "numero_cartao", length = 20)
	@Length(max = 20)
	public String getNumeroCartao() {
		return this.numeroCartao;
	}

	public void setNumeroCartao(String numeroCartao) {
		this.numeroCartao = numeroCartao;
	}

	@Column(name = "validade_cartao", length = 7)
	public String getValidadeCartao() {
		return this.validadeCartao;
	}

	public void setValidadeCartao(String validadeCartao) {
		this.validadeCartao = validadeCartao;
	}

	@Column(name = "banco", length = 30)
	@Length(max = 30)
	public String getBanco() {
		return this.banco;
	}

	public void setBanco(String banco) {
		this.banco = banco;
	}

	@Column(name = "agencia", length = 10)
	@Length(max = 10)
	public String getAgencia() {
		return this.agencia;
	}

	public void setAgencia(String agencia) {
		this.agencia = agencia;
	}

	@Column(name = "conta_corrente", length = 20)
	@Length(max = 20)
	public String getContaCorrente() {
		return this.contaCorrente;
	}

	public void setContaCorrente(String contaCorrente) {
		this.contaCorrente = contaCorrente;
	}

	@Column(name = "titular_cartao", length = 100)
	@Length(max = 100)
	public String getTitularCartao() {
		return this.titularCartao;
	}

	public void setTitularCartao(String titularCartao) {
		this.titularCartao = titularCartao;
	}

	@Column(name = "flg_proprio_condutor", nullable = false)
	public boolean isFlgProprioCondutor() {
		return this.flgProprioCondutor;
	}

	public void setFlgProprioCondutor(boolean flgProprioCondutor) {
		this.flgProprioCondutor = flgProprioCondutor;
	}

	@Column(name = "nome_condutor", length = 100)
	@Length(max = 100)
	public String getNomeCondutor() {
		return this.nomeCondutor;
	}

	public void setNomeCondutor(String nomeCondutor) {
		this.nomeCondutor = nomeCondutor;
	}

	@Column(name = "habilitacao_condutor", length = 11)
	@Length(max = 11)
	public String getHabilitacaoCondutor() {
		return this.habilitacaoCondutor;
	}

	public void setHabilitacaoCondutor(String habilitacaoCondutor) {
		this.habilitacaoCondutor = habilitacaoCondutor;
	}

	@Column(name = "regiao", length = 50)
	@Length(max = 50)
	public String getRegiao() {
		return this.regiao;
	}

	public void setRegiao(String regiao) {
		this.regiao = regiao;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "habilitacao_validade", length = 29)
	public Date getHabilitacaoValidade() {
		return this.habilitacaoValidade;
	}

	public void setHabilitacaoValidade(Date habilitacaoValidade) {
		this.habilitacaoValidade = habilitacaoValidade;
	}

	@Column(name = "cpf_condutor", length = 11)
	@Length(max = 11)
	public String getCpfCondutor() {
		return this.cpfCondutor;
	}

	public void setCpfCondutor(String cpfCondutor) {
		this.cpfCondutor = cpfCondutor;
	}

	@Column(name = "endereco_condutor", length = 100)
	@Length(max = 100)
	public String getEnderecoCondutor() {
		return this.enderecoCondutor;
	}

	public void setEnderecoCondutor(String enderecoCondutor) {
		this.enderecoCondutor = enderecoCondutor;
	}

	@Column(name = "municipio_condutor", length = 80)
	@Length(max = 80)
	public String getMunicipioCondutor() {
		return this.municipioCondutor;
	}

	public void setMunicipioCondutor(String municipioCondutor) {
		this.municipioCondutor = municipioCondutor;
	}

	@Column(name = "bairro_condutor", length = 80)
	@Length(max = 80)
	public String getBairroCondutor() {
		return this.bairroCondutor;
	}

	public void setBairroCondutor(String bairroCondutor) {
		this.bairroCondutor = bairroCondutor;
	}

	@Column(name = "telefone_condutor", length = 14)
	@Length(max = 14)
	public String getTelefoneCondutor() {
		return this.telefoneCondutor;
	}

	public void setTelefoneCondutor(String telefoneCondutor) {
		this.telefoneCondutor = telefoneCondutor;
	}

	@Column(name = "celular_condutor", length = 14)
	@Length(max = 14)
	public String getCelularCondutor() {
		return this.celularCondutor;
	}

	public void setCelularCondutor(String celularCondutor) {
		this.celularCondutor = celularCondutor;
	}

	@Column(name = "total_aluguel", nullable = true, precision = 8, scale = 8)
	public Float getTotalAluguel() {
		return this.totalAluguel;
	}

	public void setTotalAluguel(Float totalAluguel) {
		this.totalAluguel = totalAluguel;
	}

	@Column(name = "laudo_vistoria", nullable = true)
	public byte[] getLaudoVistoria() {
		return this.laudoVistoria;
	}

	public void setLaudoVistoria(byte[] laudoVistoria) {
		this.laudoVistoria = laudoVistoria;
	}

	@Column(name = "sigla_uf_condutor", length = 2)
	@Length(max = 2)
	public String getSiglaUfCondutor() {
		return this.siglaUfCondutor;
	}

	public void setSiglaUfCondutor(String siglaUfCondutor) {
		this.siglaUfCondutor = siglaUfCondutor;
	}

	@Column(name = "flg_ativo", nullable = false)
	public boolean isFlgAtivo() {
		return flgAtivo;
	}

	public void setFlgAtivo(boolean flgAtivo) {
		this.flgAtivo = flgAtivo;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_tabela_valor_automovel", nullable = true)
	public TabelaValorAutomovel getTabelaValorAutomovel() {
		return tabelaValorAutomovel;
	}

	public void setTabelaValorAutomovel(TabelaValorAutomovel tabelaValorAutomovel) {
		this.tabelaValorAutomovel = tabelaValorAutomovel;
	}
	
	@Column(name = "vlr_caucao", nullable = true)
	public Float getVlrCaucao() {
		return vlrCaucao;
	}

	public void setVlrCaucao(Float vlrCaucao) {
		this.vlrCaucao = vlrCaucao;
	}

	@Column(name = "cod_autorizacao", nullable = true, length = 4)
	public String getCodAutorizacao() {
		return codAutorizacao;
	}

	public void setCodAutorizacao(String codAutorizacao) {
		this.codAutorizacao = codAutorizacao;
	}

	@Column(name = "origem_cidade_permitida", nullable = true, length = 50)
	public String getOrigemCidadePermitida() {
		return origemCidadePermitida;
	}

	public void setOrigemCidadePermitida(String origemCidadePermitida) {
		this.origemCidadePermitida = origemCidadePermitida;
	}

	@Column(name = "origem_uf_permitida", nullable = true, length = 2)
	public String getOrigemUfPermitida() {
		return origemUfPermitida;
	}

	public void setOrigemUfPermitida(String origemUfPermitida) {
		this.origemUfPermitida = origemUfPermitida;
	}

	@Column(name = "destino_cidade_permitida", nullable = true, length = 50)
	public String getDestinoCidadePermitida() {
		return destinoCidadePermitida;
	}

	public void setDestinoCidadePermitida(String destinoCidadePermitida) {
		this.destinoCidadePermitida = destinoCidadePermitida;
	}

	@Column(name = "destino_uf_permitida", nullable = true, length = 2)
	public String getDestinoUfPermitida() {
		return destinoUfPermitida;
	}

	public void setDestinoUfPermitida(String destinoUfPermitida) {
		this.destinoUfPermitida = destinoUfPermitida;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "aluguel")
	public Set<AluguelProduto> getAluguelProdutos() {
		return this.aluguelProdutos;
	}

	public void setAluguelProdutos(Set<AluguelProduto> aluguelProdutos) {
		this.aluguelProdutos = aluguelProdutos;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "aluguel")
	public Set<PagamentoAluguel> getPagamentoAluguels() {
		return this.pagamentoAluguels;
	}

	public void setPagamentoAluguels(Set<PagamentoAluguel> pagamentoAluguels) {
		this.pagamentoAluguels = pagamentoAluguels;
	}

	@Transient
	public boolean isSelecionado() {
		return selecionado;
	}

	@Transient
	public void setSelecionado(boolean selecionado) {
		this.selecionado = selecionado;
	}
	
	@Transient
	public String getDataSaidaFormatoPadrao(){
		if(getDataSaida() != null){
			SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm");
			return formato.format(getDataSaida());
		}
		return null;
	}
	
	@Transient
	public String getDataRetornoFormatoPadrao(){
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		if(getDataRetorno() != null){
			return formato.format(getDataRetorno());
		}else if(getDataPrevistaEntrega() != null){
			return formato.format(getDataPrevistaEntrega());
		}
		return null;
	}
	
	@Transient
	public String getDataSaidaFormatada(){
		SimpleDateFormat formato = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy");
		if(getDataSaida() != null){
			return formato.format(getDataSaida()); 
		}
		return null;
	}
	
	@Transient
	public String getDataRetornoFormatada(){
		SimpleDateFormat formato = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy");
		if(getDataRetorno() != null){
			return formato.format(getDataRetorno()); 
		}else if(getDataPrevistaEntrega() != null){
			return formato.format(getDataPrevistaEntrega());
		}
		return null;
	}
	
	@Transient
	public String getDataPrevistaEntregaFormatada(){
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		if(getDataPrevistaEntrega() != null){
			return formato.format(getDataPrevistaEntrega()); 
		}
		return null;
	}

	@Transient
	public Integer getHoraSaida() {
		return horaSaida;
	}

	@Transient
	public void setHoraSaida(Integer horaSaida) {
		this.horaSaida = horaSaida;
	}

	@Transient
	public Integer getMinutoSaida() {
		return minutoSaida;
	}

	@Transient
	public void setMinutoSaida(Integer minutoSaida) {
		this.minutoSaida = minutoSaida;
	}

	@Transient
	public Integer getHoraRetorno() {
		return horaRetorno;
	}

	@Transient
	public void setHoraRetorno(Integer horaRetorno) {
		this.horaRetorno = horaRetorno;
	}

	@Transient
	public Integer getMinutoRetorno() {
		return minutoRetorno;
	}

	@Transient
	public void setMinutoRetorno(Integer minutoRetorno) {
		this.minutoRetorno = minutoRetorno;
	}

	@Transient
	public Integer getHoraPrevRetorno() {
		return horaPrevRetorno;
	}

	@Transient
	public void setHoraPrevRetorno(Integer horaPrevRetorno) {
		this.horaPrevRetorno = horaPrevRetorno;
	}

	@Transient
	public Integer getMinutoPrevRetorno() {
		return minutoPrevRetorno;
	}

	@Transient
	public void setMinutoPrevRetorno(Integer minutoPrevRetorno) {
		this.minutoPrevRetorno = minutoPrevRetorno;
	}

	@Transient
	public ValorPagamento getPagamentoDiarias() {
		if (pagamentoDiarias == null) {
			pagamentoDiarias = new ValorPagamento();
		}
		return pagamentoDiarias;
	}

	@Transient
	public void setPagamentoDiarias(ValorPagamento pagamentoDiarias) {
		this.pagamentoDiarias = pagamentoDiarias;
	}

	@Transient
	public List<AluguelProduto> getProdutosAlugados() {
		if (produtosAlugados == null) {
			produtosAlugados = new ArrayList<AluguelProduto>();
		}
		return produtosAlugados;
	}

	@Transient
	public void setProdutosAlugados(List<AluguelProduto> produtosAlugados) {
		this.produtosAlugados = produtosAlugados;
	}

	@Transient
	public boolean isShowIconeAlerta() {
		return showIconeAlerta;
	}

	public void setShowIconeAlerta(boolean showIconeAlerta) {
		this.showIconeAlerta = showIconeAlerta;
	}
	
	@Transient
	public String getTotalAluguelFormatado(){
		if(this.getTotalAluguel() != null){
			return UtilString.getInstance().formatarMoeda(this.getTotalAluguel());
		}
		return null;
	}
	
	@Transient
	public String getVlrCaucaoFormatado(){
		if(this.getVlrCaucao() != null){
			return UtilString.getInstance().formatarMoeda(this.getVlrCaucao());
		}
		return null;
	}

	@Transient
	public Cobertura getCobertura() {
		return cobertura;
	}

	@Transient
	public void setCobertura(Cobertura cobertura) {
		this.cobertura = cobertura;
	}

	@Transient
	public Float getTotalDescontos() {
		return totalDescontos;
	}

	@Transient
	public void setTotalDescontos(Float totalDescontos) {
		this.totalDescontos = totalDescontos;
	}
	
	@SuppressWarnings("static-access")
	@Transient
	public String getTotalDescontosFormatado(){
		if(getTotalDescontos() != null){
			/*
			DecimalFormat df = new DecimalFormat("#.###,00");
			return "R$ "+df.format(this.getTotalDescontos());
			*/
			return UtilString.getInstance().formatarMoeda(this.getTotalDescontos()); 
		}
		return null;
	}
	
	@Transient
	public String getIdAluguelFormatado() {
		if (this.getIdAluguel() != null) {
			return UtilString.getInstance().formatarContrato(this.getIdAluguel().toString());
		}
		return null;
	}
}
